#ifndef RECTANGLEREGIONDRAWER_H
#define RECTANGLEREGIONDRAWER_H

#include <QObject>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QPointF>
#include <QList>
#include "../Common/DraggableRectItem.h"

// 提前声明，避免循环依赖
enum class MeasurementMode : int;

/**
 * @brief 矩形区域测量绘制器类
 * 
 * 用于在图像上绘制矩形区域测量工具，根据图像参数在中心位置默认绘制，并支持鼠标拖动。
 * 继承自QObject，提供信号槽机制支持。
 */
class RectangleRegionDrawer : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父对象
     */
    explicit RectangleRegionDrawer(QObject *parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~RectangleRegionDrawer();

    /**
     * @brief 设置图形场景
     * @param scene 图形场景指针
     */
    void setScene(QGraphicsScene *scene);

    /**
     * @brief 初始化并显示矩形区域
     * @param imageWidth 图像宽度
     * @param imageHeight 图像高度
     * @param scale 缩放比例
     * @param offset 图像偏移
     * @param defaultWidth 默认矩形宽度
     * @param defaultHeight 默认矩形高度
     */
    void initializeRectangle(int imageWidth, int imageHeight, double scale = 1.0, const QPointF &offset = QPointF(0, 0),
                            int defaultWidth = 100, int defaultHeight = 100);

    /**
     * @brief 清除所有绘制项
     */
    void clearAll();

    /**
     * @brief 获取测量结果
     * @return 包含测量参数的映射
     */
    QVariantMap getMeasurementResult() const;

    /**
     * @brief 获取测量模式
     * @return 测量模式枚举值
     */
    MeasurementMode getMeasurementMode() const;

    /**
     * @brief 从测量结果恢复绘制
     * @param result 测量结果
     * @param scale 当前缩放比例
     * @param offset 当前图像偏移
     */
    void restoreFromResult(const QVariantMap &result, double scale = 1.0, const QPointF &offset = QPointF(0, 0));

    /**
     * @brief 设置绘制样式参数
     * @param params 样式参数映射
     */
    void setParameters(const QVariantMap &params);

    /**
     * @brief 更新缩放和偏移信息
     * @param scale 缩放比例
     * @param offset 图像偏移
     */
    void updateTransformInfo(double scale, const QPointF &offset);
    
    /**
     * @brief 设置缩放比例
     * @param scale 新的缩放比例
     */
    void setScale(double scale);
private:
    
    /**
     * @brief 创建矩形项
     * @param rect 矩形区域
     * @return 创建的矩形项指针
     */
    DraggableRectItem *createRectItem(const QRectF &rect);

    /**
     * @brief 初始化绘制样式
     */
    void initializeStyles();
    
    /**
     * @brief 添加绘制项到场景
     * @param item 要添加的图形项
     */
    void addDrawingItem(QGraphicsItem *item);

    /**
     * @brief 移除所有绘制项
     */
    void removeAllItems();
    
    /**
     * @brief 计算场景坐标转换为原始图像像素坐标
     * @param scenePos 场景坐标
     * @return 原始图像像素坐标
     */
    QPointF sceneToImageCoordinates(const QPointF &scenePos) const;

    /**
     * @brief 计算原始图像像素坐标转换为场景坐标
     * @param imagePos 原始图像像素坐标
     * @return 场景坐标
     */
    QPointF imageToSceneCoordinates(const QPointF &imagePos) const;

    /**
     * @brief 矩形位置变化处理槽
     */
    void onRectPositionChanged();

signals:
    /**
     * @brief 矩形区域变化信号
     * @param rectInPixels 相对于原始图像的像素坐标矩形
     */
    void rectangleChanged(const QRectF &rectInPixels);

private:
    QGraphicsScene *m_scene; ///< 图形场景指针
    DraggableRectItem *m_rectItem; ///< 矩形项
    QList<QGraphicsItem *> m_drawingItems; ///< 绘制项列表

    // 图像参数
    int m_imageWidth; ///< 图像宽度
    int m_imageHeight; ///< 图像高度
    double m_scale; ///< 缩放比例
    QPointF m_offset; ///< 图像偏移

    // 样式参数
    QPen m_rectPen; ///< 矩形画笔
    QBrush m_rectBrush; ///< 矩形画刷
    int m_lineWidth; ///< 线宽
    QColor m_lineColor; ///< 线颜色
    QColor m_fillColor; ///< 填充颜色
    double m_fillOpacity; ///< 填充透明度

    
};

#endif // RECTANGLEREGIONDRAWER_H
